/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MainBiblioSoft;

import GUI.Ingreso.IngresoSistema;
import LogicaNegocio.Biblioteca.CargarAsignacionMultas;
import LogicaNegocio.Controlador.Semaforo;
import LogicaNegocio.Empleados.Bibliotecario;
import LogicaNegocio.Empleados.JefeBibliotecario;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.swing.UIManager;

/**
 * Esta clase en java es la clase que contiene el Main para el sistema
 * BiblioSoft, desde esta clase el sistema inicia su ejecucion.
 *
 * @author sebaxtian
 * Archivo: BiblioSoft.java
 * @version 1.0
 * Fecha: vie may  7 01:18:53 COT 2010
 */


public class BiblioSoft {

    //Atributos de clase
    //atributos globales a todas las clases del sistema BiblioSoft
    private static final String UNIDADPERSISTENCIA = "BiblioSoftHomeUV";
    public static EntityManagerFactory managerFactory;
    public static JefeBibliotecario jefeBibliotecario;
    public static Bibliotecario bibliotecario;
    public static IngresoSistema ingresoSistema;
    private static CargarAsignacionMultas cargarAsignacionMultas;
    private static Thread hiloLoadManagerFactory;
    private static Thread hiloLoadSplash;
    private static Thread hiloCargarAsignacionMultas;
    private static Semaforo mutex1 = new Semaforo(1);

    public static void main(String[] agrs) {
        if(agrs != null){
            loadLookAndFeel();
            mutex1.P();
            hiloLoadManagerFactory = new Thread(new LoadManagerFactory());
            hiloLoadSplash = new Thread(new LoadSplash());
            hiloLoadManagerFactory.start();
            hiloLoadSplash.start();
        }
        mutex1.P();
        ingresoSistema = new IngresoSistema();
        mutex1.V();
    }

    private static void loadLookAndFeel() {
        try{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(Exception exc){
        }
    }

    private static class LoadManagerFactory implements Runnable {

        public void run() {
            managerFactory = Persistence.createEntityManagerFactory(UNIDADPERSISTENCIA);
            cargarAsignacionMultas = new CargarAsignacionMultas();
            hiloCargarAsignacionMultas = new Thread(cargarAsignacionMultas);
            hiloCargarAsignacionMultas.start();
            mutex1.V();
        }
    }

    private static class LoadSplash implements Runnable {

        public void run() {
            Splash bienvenida = new Splash();
            bienvenida.barraProgreso.setIndeterminate(true);
            mutex1.P();
            bienvenida.dispose();
            mutex1.V();
        }
    }
}
